<?php

use Log\SeasLog;
use Service\ResponseService;
use Service\MessageService;

class ErrorController extends \Yaf\Controller_Abstract
{
    /**
     * @param $exception \Core\Exception;
     */
    public function errorAction($exception)
    {
        // 定义是否业务抛出错误
        $isCustomMessage = 0;
        // 1.错误信息整理
        $code = $exception->getCode();
        $data = method_exists($exception,'getData') ? $exception->getData() : [];
        // 错误信息优先级：代码错误信息 > 业务逻辑抛出的错误信息 > 根据code去错误表预先定义的信息
        if ($code == 1){
            $msg = $exception->getMessage() === '' ? '操作成功' : $exception->getMessage();
            $debugMsg  = '';
            $isCustomMessage = 1;
        }else{
            $customMessage = MessageService::get($code);
            if(!empty($customMessage)){
                // 业务逻辑抛出的错误信息
                $msg  = $exception->getMessage();
                $debugMsg =  method_exists($exception,'getDebugMsg') ? $exception->getDebugMsg() : '';
                if( empty($msg) ){
                    // 没有自定义错误信息，就去错误表里面查
                    $msg = $customMessage['msg'];
                    $debugMsg = empty($debugMsg) ? $customMessage['message'] : $debugMsg;
                }
                $isCustomMessage = 1;
            }else{
                //php,yaf的错误, Yaf_Exception抛出的，只有getMessage()方法;
                // 找不到资源特殊处理516
                if(in_array($code , [515,516,517,518])){
                    $msg = '抱歉，你所访问的页面不存在';
                    $debugMsg  = $exception->getMessage();
                }else{
                    $msg = '抱歉，服务器走丢了(' . $code . ')';
                    $debugMsg  = $exception->getMessage();
                }
                // 2.只有非自定义信息才记录日志
                SeasLog::error($code . ' | ' . $debugMsg );
            }
        }


        // 3.根据不同请求返回
        if ($this->getRequest()->isPost()) {
            if(DEBUG){
                ResponseService::json($code, $msg, ['token'=>$data['token'],'data'=>$data['data']],'',$debugMsg);
            }else{
                ResponseService::json($code, $msg, ['token'=>$data['token'],'data'=>$data['data']]);
            }
        } else {
            $this->specialView($code, $data['data']);
            $view = compact('code', 'msg', 'debugMsg', 'isCustomMessage');
            $view['title'] = '温馨提示';
            if(!empty($data['redirectUrl'])){
                if(strpos($data['redirectUrl'], 'http') !==false OR strpos($data['redirectUrl'],'https') !== false){
                    // 完整的跳转地址
                    $view['redirectUrl'] = $data['redirectUrl'];
                }else{
                    // 内部跳转地址
                    $view['redirectUrl'] = siteUrl(SITE_URL, $data['redirectUrl']);
                }
            }else{
                if( !empty($this->getRequest()->getServer('HTTP_REFERER')) ){
                    $view['redirectUrl'] = $this->getRequest()->getServer('HTTP_REFERER');
                }else{
                    $view['redirectUrl'] = siteUrl(SITE_URL, 'mobile/index/index');
                }
            }
            ResponseService::view($this, $view);
        }
    }


    /**
     * 根据特定的状态码，进行指定的页面跳转
     * （因为移动端调用this->view()之前调用逻辑层，抛出异常会直接输出error.html，而本函数希望输出指定的自定义页面,而不是输出error.html）
     * @param $code
     * @param array $data
     * @return bool
     */
    private function specialView($code, $data = []){
        if (!is_numeric($code)){
            return false;
        }
        switch ($code){
            default:
                break;
        }
        return false;
    }
}